// 全局变量定义
// String TimeClock[2] = {"", ""};      // 0:上次触发时间 1:当前触发时间
String TimeClock = "";
unsigned long timestamp = 0;         // 当前时间戳
unsigned long Timeflag[2] = {0, 0};  //{时间戳1，时间戳2}
unsigned long His_Time[2] = {0, 0};  //{前1时间戳1，前1时间戳2}
unsigned long doorCount[2] = {0, 0}; //{进，出}
String latestDoorStatus = "";        // 当前门进出状态
bool doorTouch = false;              // 门触发标志
uint64_t totalSdSize = 0;            // sd卡总容量

// unsigned long analyse_num = 0;       // 统计的条目数量

// 个人库
#include "display.h"
// void init_display();
// void oled_print_single(unsigned short x, unsigned short y, String str); // 单次打印
// void oled_print_module(unsigned short x, unsigned short y, String str); // 组合打印，需自行发送u8g2.sendBuffer();

#include "sd_card.h"

#include "RTChandle.h"
// void init_RTC(bool init_time);               // 初始化RTC, 如果init_time为true, 则初始化时间
// String printDateTime(const RtcDateTime &dt); // 输出日期时间
void life_variable();
#include "counthandle.h"
// void init_countdoor(); // 初始化门禁计数器
#include "SHT30.h"
#include "setwifi.h"
// #include "serverhandle.h"
// void httpRecive(); // 接收http请求

void showRequest();
// ---自定义功能函数-- //
void Main_interface() // 主界面显示，主要靠全局变量来统一刷新
{
    if (doorTouch == true)
    {
        doorTouch = false;
        static String doorflag[3] = {"", "", ""};
        for (short i = 0; i < 2; i++)
        {
            doorflag[i] = doorflag[i + 1];
        }
        doorflag[2] = TimeClock + " " + latestDoorStatus;

        // 显示部分
        u8g2.clearBuffer(); // 触发时间
        oled_print_module(0, 15, "I: " + String(doorCount[0]) + "  O: " + String(doorCount[1]));
        oled_print_module(0, 35, doorflag[0]);
        oled_print_module(0, 50, doorflag[1]);
        oled_print_module(0, 65, doorflag[2]);
        u8g2.sendBuffer();

        // 存储部分
        tf.appendFile("/config/Record.txt", ("ID:" + DeviceID + " " + TimeClock + " " + sht30_read() + " " + latestDoorStatus + "\n").c_str());
        delay(5);
        tf.writeFile("/config/variable.txt", (String(doorCount[0]) + "\n" + String(doorCount[1]) + "\n").c_str());
        // delay(5);
        showRequest(); // 发送数据给show服务器
        // inductive_analyse(); // 数据分析归纳
    }
}

//**********向show服务器发送温度数据**********//
void showRequest()
{
    WiFiClient client;
    float usedSdSize = ((SD.usedBytes() * 1.0 / (1024 * 1024)) / totalSdSize * 1.0) * 100;
    // 将需要发送的数据信息放入客户端请求   //设备号
    String showurl = "/Collect?ID=" + DeviceID +
                     "&Time=" + TimeClock +
                     "&InNumber=" + String(doorCount[0]) +
                     "&OutNumber=" + String(doorCount[1]) + //发送数量
                     "&Temp=" + String(g_temp, 1) +
                     "&Hum=" + String(g_rh, 1) +
                     "&DiskFree=" + String(usedSdSize, 2);

    // 建立字符串，用于HTTP请求
    String httpRequest = String("GET ") + showurl + " HTTP/1.1\r\n" +
                         "Host: " + showhost + "\r\n" +
                         "Connection: close\r\n" +
                         "\r\n";

    Serial.print("Connecting to ");
    Serial.print(showhost);

    if (client.connect(showhost.c_str(), httpPort)) //如果连接失败则串口输出信息告知用户然后返回loop
    {
        Serial.println(" Sucess");

        client.print(httpRequest);           // 向服务器发送HTTP请求
        Serial.println("Sending request: "); // 通过串口输出HTTP请求信息内容以便查阅
        Serial.println(httpRequest);
    }
    else
    {
        Serial.println(" failed");
    }

    client.stop();
}

void tickerCount() // 定时器，用于生成时间戳，来赋予进出门判断
{
    life_variable(); // 全局变量阈值判断
    timestamp++;
}

void init_variable() // 从tf卡中获取变量数据
{
    // 读取变量
    doorCount[0] = tf.readFileLine("/config/variable.txt", 1).toInt();
    delay(5);
    doorCount[1] = tf.readFileLine("/config/variable.txt", 2).toInt();
    delay(5);
    DeviceID = tf.readFileLine("/config/ID.txt", 1);
    delay(5);
    totalSdSize = SD.totalBytes() / (1024 * 1024); //总空间  MB
    // analyse_num = (tf.readFile("/config/analyse_num.txt")).toInt(); // 获取统计的条目数量
    // if (analyse_num != 0)
    // {
    //     String str = tf.readFileLine("/config/analyse_num.txt", analyse_num);
    //     TimeClock[0] = str.substring(0, str.indexOf("I") - 1); // 获取上一个时间戳 截取到小时
    // }
}

void life_variable() //变量寿命阈值，超过阈值则清零   定时任务
{
    if (timestamp > 1000000000)
    {
        timestamp = 0;
        Timeflag[0] = 0;
        Timeflag[1] = 0;
    }
    if (doorCount[0] > 1000000000 || doorCount[1] > 1000000000)
    {
        doorCount[0] = 0;
        doorCount[1] = 0;
    }
}
// ----- //

/* analyse.txt 结构 
12-24 20 I:1 O:0
12-24 21 I:1 O:0
12-24 22 I:1 O:1

  analyse_num.txt 结构 
3
*/

/*  程序结构
判断最后一条数据是否为当前小时
    是：修改IO数量
    否：创建新统计条目， 统计条目数量+1


*/
// void inductive_analyse() //12-24 20 I:1 O:0
// {
//     if (TimeClock[0] != "" && TimeClock[1].startsWith(TimeClock[0])) // 与上一个统计数据时间戳相同，则改变IO数量
//     {
//         Serial.println("hour same " + TimeClock[0] + "-----" + TimeClock[1]);
//         String lastone = tf.readFileLine("/config/analyse_num.txt", analyse_num); // 读取最后一条数据
//         Serial.println("lastone: " + lastone);
//         if (latestDoorStatus == "I")
//         {
//             int I_num_pos_start = lastone.indexOf(":") + 1;                                       // I的数量位置
//             int I_num_pos_end = lastone.lastIndexOf(" ");                                         // I的数量长度
//             unsigned int I_num = (lastone.substring(I_num_pos_start, I_num_pos_end)).toInt() + 1; // 取出上一次的进数量
//             lastone = lastone.substring(0, I_num_pos_start) + String(I_num) + lastone.substring(I_num_pos_end);
//         }
//         else if (latestDoorStatus == "O")
//         {
//             int O_num_pos = lastone.lastIndexOf(":") + 1; // O的数量位置
//             // int O_num_len = lastone.length() - lastone.indexOf(":", lastone.indexOf(":") + 1) + 1; // O的数量长度
//             unsigned int O_num = (lastone.substring(O_num_pos)).toInt() + 1; // 取出上一次的出数量
//             lastone = lastone.substring(0, O_num_pos) + String(O_num);
//         }

//         // 修改tf卡中IO数量
//         tf.modifyFileLine("/config/analyse.txt", analyse_num, (lastone).c_str());
//         Serial.println("Done_lastone: " + lastone);
//     }
//     else // 与上一个统计数据时间戳不同，则新增
//     {
//         TimeClock[0] = TimeClock[1].substring(0, TimeClock[1].indexOf(":")); // 更新上一个时间戳 截取到小时
//         // 新增一条统计数据
//         if (latestDoorStatus == "I")
//         {
//             tf.appendFile("/config/analyse.txt", (TimeClock[0] + " I:1 O:0" + "\n").c_str() );
//         }
//         else if (latestDoorStatus == "O")
//         {
//             tf.appendFile("/config/analyse.txt", (TimeClock[0] + " I:0 O:1" + "\n").c_str());
//         }
//         analyse_num += 1;
//         tf.writeFile("/config/analyse_num.txt", String(analyse_num).c_str()); // 统计的条目数量+1
//     }
// }